import Vue from 'vue'
import Axios from 'axios'
import { VueAxios } from './vue-axios'
import { online } from '@/utils/env'
import { appSetting } from '@/setting/app-setting'
import notification from 'ant-design-vue/es/notification'

const H_CT_FORM = { 'Content-Type': 'application/x-www-form-urlencoded' }
const H_CT_JSON = { 'Content-Type': 'application/json;charset=UTF-8' }

const CODE_MSG = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',

  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',

  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。'
}

/*
    参考文档：
        https://www.kancloud.cn/yunye/axios/234845

    全局的 axios 默认值
    axios.defaults.baseURL = 'https://api.example.com';
    axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
 */

// 设置请求头
Axios.defaults.withCredentials = true
Axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

/**
 *  axios 基础配置
 * @returns {{baseURL: string, timeout: number}}
 */
let base_cfg = {
  baseURL: online() ? appSetting.baseUrl.online : appSetting.baseUrl.develop, // 请求的服务器地址
  timeout: appSetting.timeout // 请求超时时间
}

// 创建 axios 实例
const axios = Axios.create(base_cfg)

const err = (error) => {
  if (error.response) {
    if (error.status === 403) {
      notification.error({ message: '拒绝访问', description: '无权限，拒绝访问' })
    }

    if (error.status === 401) {
      notification.error({ message: '未授权', description: 'Token 错误或无权操作' })
      // 退出？
      // store.dispatch('logout').then(() => {
      //     location.reload()
      // })
    }
  }
  return Promise.reject(error)
}

// request 拦截器
axios.interceptors.request.use(config => {
  const token = Vue.ls.get(appSetting.token_key)
  // 让每个请求携带自定义 token 请根据实际情况自行修改
  if (token) config.headers[appSetting.headers_auth_key] = token

  if (config.data) config.data = JSON.stringify(config.data)
  return config
}, err)

// response 拦截器
axios.interceptors.response.use((response) => {
  return response.data
}, err)

const installer = {
  vm: {},
  install (Vue, router = {}) {
    Vue.use(VueAxios, router, axios)
  }
}

export {
  CODE_MSG,
  H_CT_FORM,
  H_CT_JSON,

  installer as VueAxios,
  axios
}
